import classloader.DynamicLoader;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: liuliwei
 * Date: 2017-07-27
 * Time: 上午10:32
 * Description: ${description}
 */


public class ReadFile {
    static Map<String, Long> hotSwapMap = Maps.newHashMap();
    private static List<String> hotSwapList = Lists.newArrayList();
    private static Map<String, Long> fileModifyTimeMap = Maps.newHashMap();

    private static void test(String fileDir) {
        initData(fileDir);
        List<File> fileList = new ArrayList<File>();
        File file = new File(fileDir);
        File[] files = file.listFiles();// 获取目录下的所有文件或文件夹
        if (files == null) {// 如果目录为空，直接退出
            return;
        }
        // 遍历，目录下的所有文件
        for (File f : files) {
            if (f.isFile()) {
                fileList.add(f);
                addHotSwapFile(f);
            } else if (f.isDirectory()) {
//                System.out.println(f.getAbsolutePath());
                test(f.getAbsolutePath());
            }
        }
        for (File f1 : fileList) {
//            System.out.println(f1.getName());
        }
    }

    /**
     * 添加要热替换的文件
     *
     * @param f
     */
    private static void addHotSwapFile(File f) {
        if (f.lastModified() > fileModifyTimeMap.get(getFullName(f))) {
            if (!hotSwapList.contains(getFullName(f))&& StringUtils.isNotEmpty(getFullName(f))) {
                hotSwapList.add(getFullName(f));
            }
            fileModifyTimeMap.put(getFullName(f), f.lastModified());
        }
    }

    /**
     * 根据文件得到全限定名
     *
     * @param f 文件
     * @return
     */
    private static String getFullName(File f) {
        String java = Lists.newArrayList(Splitter.on("java").split(f.getAbsolutePath())).get(1).replace("/", ".");
        if (java.length() > 1)
            return java.substring(1, java.length() - 1);
        return "";
    }

    /**
     * 初始化数据
     *
     * @param f 文件
     * @return
     */
    private static void initData(String fileDir) {
        if (fileModifyTimeMap.isEmpty()) {
            doInitData(fileDir);
        }
    }

    /**
     * 初始化数据
     *
     * @param fileDir
     */
    private static void doInitData(String fileDir) {
        File file = new File(fileDir);
        File[] files = file.listFiles();// 获取目录下的所有文件或文件夹
        if (files == null) {// 如果目录为空，直接退出
            return;
        }
        // 遍历，目录下的所有文件
        for (File f : files) {
            if (f.isFile()) {
                fileModifyTimeMap.put(getFullName(f), f.lastModified());
            } else if (f.isDirectory()) {
                doInitData(f.getAbsolutePath());
            }
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
//
        int i = 1;
        while (true) {
            System.out.println("current is :" + i++);
//            test("");
            test("src");

            DynamicLoader loader = new DynamicLoader("/Users/liuliwei/Documents/nettyTest/target/classes/");
            for (String s : hotSwapList) {
                Class clazz = loader.loadClass(s);
                System.out.println("clazz" + clazz);
            }
            Show show = new Show();
            show.show();
            System.out.println(hotSwapList);
            System.out.println(fileModifyTimeMap);

            try {
                Thread.sleep(3000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}